package view.ventanas_principales.panels;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import model.Estado_Recado;
import model.Persona;
import model.Recado;
import model.comunication.IInstructor;
import model.comunication.IPersonalAdministrativo;
import model.comunication.IRecado;
import model.comunication.IUsuario;
import view.recados.CrearRecado;
import view.recados.FormatoCelda;
import view.recados.RecadoEntrada;

public class EntradaPanel extends JPanel {

	private static final long serialVersionUID = 1L;

	private IRecado cmmRecado = IRecado.getInstance();
	private IUsuario cmmUsuario = IUsuario.getInstance();
	private IInstructor cmmInstructor = IInstructor.getInstance();
	private IPersonalAdministrativo cmmEmpleadoAdministrativo = IPersonalAdministrativo.getInstance();
	private List<Recado> recados;
	private JPanel panel;
	private JTable tableEntrada;
	private DefaultTableModel modeloEntrada;
	private int id;

	public EntradaPanel(Persona persona) {
		if (cmmInstructor.getInstructor(persona.getDNI()).getDNI() != null) {
			id = cmmInstructor.getInstructor(persona.getDNI()).getIdUsuario();
		} else {
			id = cmmEmpleadoAdministrativo.getPersonalAdministrativo(persona.getDNI()).getIdUsuario();
		}
		inicialize();
	}

	@SuppressWarnings("unchecked")
	private void inicialize() {
		recados = new ArrayList<Recado>();
		tableEntrada = new JTable();
		tableEntrada.setModel(new DefaultTableModel(new Object[][] {}, new String[] { "Emisor", "Asunto", "Fecha", "esNuevo" }));
		tableEntrada.getColumnModel().getColumn(3).setPreferredWidth(0);
		tableEntrada.getColumnModel().getColumn(3).setMinWidth(0);
		tableEntrada.getColumnModel().getColumn(3).setMaxWidth(0);
		tableEntrada.getTableHeader().setReorderingAllowed(false);
		this.add(tableEntrada);

		setLayout(new BorderLayout(0, 0));
		JScrollPane scrollEntrada = new JScrollPane(tableEntrada);
		this.add(scrollEntrada);

		modeloEntrada = (DefaultTableModel) tableEntrada.getModel();

		recados = cmmRecado.getRecado(Estado_Recado.No_Leido, cmmUsuario.getUsuario(id));
		recados.addAll(cmmRecado.getRecado(Estado_Recado.Leido, cmmUsuario.getUsuario(id)));
		for (int i = 0; i < recados.size(); i++) {
			if (recados.get(i).getborradoReceptor().equals("si")) {
				recados.remove(i);
			}
		}
		Collections.sort(recados);
		invertirLista();

		for (Recado recado : recados) {
			String estado = "no";
			if (recado.getEstado().equals(Estado_Recado.No_Leido)) {
				estado = "si";
			}
			SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy HH:mm");
			String fechaRecado = format.format(recado.getFecha().getTime());

			String[] lista = { recado.getEmisor().getName(), recado.getAsunto(), fechaRecado, estado };
			modeloEntrada.addRow(lista);
		}

		FormatoCelda mr = new FormatoCelda(3);
		tableEntrada.setDefaultRenderer(Object.class, mr);

		panel = new JPanel();
		FlowLayout flowLayout = (FlowLayout) panel.getLayout();
		flowLayout.setAlignment(FlowLayout.LEFT);
		add(panel, BorderLayout.SOUTH);

		// Inicializacion de botones

		generarBotonLeer();

		generarBotonEnviar();

		generarBotonActualizar();

	}

	private void invertirLista() {
		Recado auxiliar = null;
		for (int i = 0; i < recados.size() / 2; i++) {
			if (i != recados.size() - i) {
				auxiliar = recados.get(i);
				recados.set(i, recados.get(recados.size() - i - 1));
				recados.set(recados.size() - i - 1, auxiliar);
			}
		}
	}

	/**
	 * Genero el boton que permite enviar recados y lo agrego al panel
	 */
	private void generarBotonEnviar() {
		JButton btnEnviar = new JButton("Enviar");
		btnEnviar.setIcon(new ImageIcon(EntradaPanel.class.getResource("/Icon_/up_16.png")));
		btnEnviar.setFont(new Font("Tahoma", Font.BOLD, 11));
		panel.add(btnEnviar);

		btnEnviar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				@SuppressWarnings("unused")
				CrearRecado recado = new CrearRecado(id);
			}
		});
	}

	/**
	 * Genero el boton que actualiza la lista de recados y lo agrego al panel
	 */
	private void generarBotonActualizar() {

		JButton btnActualizarVentana = new JButton("Actualizar");
		btnActualizarVentana.setIcon(new ImageIcon(EntradaPanel.class.getResource("/Icon_/Actualizar_162.png")));
		btnActualizarVentana.setFont(new Font("Tahoma", Font.BOLD, 11));
		btnActualizarVentana.addActionListener(new ActionListener() {
			@SuppressWarnings("unchecked")
			public void actionPerformed(ActionEvent arg0) {
				modeloEntrada.setRowCount(0);

				recados = cmmRecado.getRecado(Estado_Recado.No_Leido, cmmUsuario.getUsuario(id));
				recados.addAll(cmmRecado.getRecado(Estado_Recado.Leido, cmmUsuario.getUsuario(id)));
				for (int i = 0; i < recados.size(); i++) {
					if (recados.get(i).getborradoReceptor().equals("si")) {
						recados.remove(i);
					}
				}
				Collections.sort(recados);
				invertirLista();

				for (Recado recado : recados) {
					String estado = "no";
					if (recado.getEstado().equals(Estado_Recado.No_Leido)) {
						estado = "si";
					}
					SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy HH:mm");
					String fechaRecado = format.format(recado.getFecha().getTime());

					String[] lista = { recado.getEmisor().getName(), recado.getAsunto(), fechaRecado, estado };
					modeloEntrada.addRow(lista);
				}

				FormatoCelda mr = new FormatoCelda(3);
				tableEntrada.setDefaultRenderer(Object.class, mr);
			}
		});
		panel.add(btnActualizarVentana);
	}

	/**
	 * Genero el boton que lee el recado seleccionado y lo agrego al panel
	 */
	private void generarBotonLeer() {
		JButton btnLeerEntrada = new JButton("Leer");
		btnLeerEntrada.setIcon(new ImageIcon(EntradaPanel.class.getResource("/Icon_/search_16.png")));
		btnLeerEntrada.setFont(new Font("Tahoma", Font.BOLD, 11));
		panel.add(btnLeerEntrada);

		btnLeerEntrada.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				int i = tableEntrada.getSelectedRow();

				if (i != -1) {
					Recado recado = recados.get(i);
					recado.setEstado(Estado_Recado.Leido);
					cmmRecado.updateRecado(recado);

					@SuppressWarnings("unused")
					RecadoEntrada entrada = new RecadoEntrada(recado);
				}
			}
		});
	}

	public void setId(int i) {
		id = i;
	}
}
